package com.huanyang.usebitmap

import android.Manifest
import android.content.ContentValues
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.apache.poi.xwpf.usermodel.XWPFDocument
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream

class WordActivity : AppCompatActivity() {
    private val selectedImageUris = mutableListOf<Uri>() // 存储选中的图片Uri
    private lateinit var rvSelectedImages: RecyclerView
    private lateinit var adapter: SelectedImageAdapter

    // 请求码定义
    private val REQUEST_SELECT_IMAGES = 100   // 多选图片请求码
    private val REQUEST_STORAGE_PERMISSION = 200 // 存储权限请求码

    @RequiresApi(Build.VERSION_CODES.Q)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_word)

        // 初始化RecyclerView（垂直列表，可改为GridLayoutManager实现多列）
        rvSelectedImages = findViewById(R.id.rv_selected_images)
        rvSelectedImages.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        adapter = SelectedImageAdapter(this, selectedImageUris) { position ->
            // 删除图片的回调：移除Uri并刷新Adapter
            selectedImageUris.removeAt(position)
            adapter.notifyItemRemoved(position)
            adapter.notifyItemRangeChanged(position, selectedImageUris.size)
        }
        rvSelectedImages.adapter = adapter

        // 「选择图片（多选）」按钮点击事件
        findViewById<Button>(R.id.btn_select_images).setOnClickListener {
            requestStoragePermission()
        }

        // 「生成Word」按钮点击事件
        findViewById<Button>(R.id.btn_generate_word).setOnClickListener {
            generateWordFromImages()
        }
    }

    /**
     * 请求存储权限（Android 6.0+ 动态申请）
     */
    private fun requestStoragePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                REQUEST_STORAGE_PERMISSION
            )
        } else {
            openGalleryForMultiSelect() // 权限通过，打开多选相册
        }
    }

    /**
     * 打开系统相册（支持多选）
     */
    private fun openGalleryForMultiSelect() {
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) // 关键：允许多选
        startActivityForResult(intent, REQUEST_SELECT_IMAGES)
    }

    /**
     * 处理相册返回的多选结果
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_SELECT_IMAGES && resultCode == RESULT_OK && data != null) {
            // 情况1：多选（返回ClipData，包含多个Uri）
            if (data.clipData != null) {
                val clipData = data.clipData
                for (i in 0 until clipData!!.itemCount) {
                    val uri = clipData.getItemAt(i).uri
                    selectedImageUris.add(uri)
                }
            }
            // 情况2：单选（兼容部分设备的多选逻辑）
            else if (data.data != null) {
                val uri = data.data
                uri?.let { selectedImageUris.add(it) }
            }
            // 刷新RecyclerView展示新选的图片
            adapter.notifyDataSetChanged()
        }
    }

    /**
     * 处理权限请求结果
     */
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_STORAGE_PERMISSION) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openGalleryForMultiSelect() // 权限通过，打开相册
            } else {
                Toast.makeText(this, "需要存储权限才能选择图片", Toast.LENGTH_SHORT).show()
            }
        }
    }

    /**
     * 核心逻辑：多图转Word（OCR识别 + Apache POI 生成）
     */
    @RequiresApi(Build.VERSION_CODES.Q)
    private fun generateWordFromImages() {
        if (selectedImageUris.isEmpty()) {
            Toast.makeText(this, "请先选择至少1张图片", Toast.LENGTH_SHORT).show()
            return
        }

        // Android 10以下需额外申请「写存储权限」
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED
            ) {
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    300 // 临时请求码
                )
                return
            }
        }

        // 协程中执行（耗时操作，避免ANR）
        lifecycleScope.launch(Dispatchers.IO) {
            try {
                // 1. 创建Word文档对象
                val doc = XWPFDocument()

                // 2. 遍历所有选中的图片，逐一生成OCR文字 + 插入原图
                for (uri in selectedImageUris) {
                    // 2.1 用Glide将Uri转成Bitmap（避免OOM）
                    val bitmap = Glide.with(this@WordActivity)
                        .asBitmap()
                        .load(uri)
                        .submit()
                        .get()

                    // 2.2 OCR识别图片文字（需集成Tesseract，示例中简化为“模拟文字”）
                    val ocrText = recognizeTextWithTesseract(bitmap)

                    // 2.3 向Word中添加「识别的文字」
                    val textParagraph = doc.createParagraph() // 创建文字段落
                    val textRun = textParagraph.createRun() // 创建文字块
                    textRun.setText(ocrText) // 设置识别的文字

                    // 2.4 向Word中添加「原图」
                    val imageParagraph = doc.createParagraph() // 创建图片段落
                    val imageRun = imageParagraph.createRun() // 创建图片块

                    // 将Bitmap转为字节数组（PNG格式，使用Android原生Bitmap.compress）
                    val baos = ByteArrayOutputStream()
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos) // 核心替换点
                    val imageBytes = baos.toByteArray()
                    baos.close()

                    // 插入图片到Word（文件名必须带后缀，否则POI无法识别格式）
                    imageRun.addPicture(
                        ByteArrayInputStream(imageBytes),
                        XWPFDocument.PICTURE_TYPE_PNG,
                        "image_${System.currentTimeMillis()}.png", // 关键：添加.png后缀
                        400, // 自定义宽度
                        300  // 自定义高度
                    )
                }

                // 3. 保存Word到「下载目录」（适配Android 10+ 存储规则）
                val fileName = "${System.currentTimeMillis()}.docx" // 动态生成文件名
                val contentValues = ContentValues().apply {
                    put(MediaStore.Downloads.DISPLAY_NAME, fileName) // Word 文件名
                    // Word (.docx) 的标准 MIME 类型
                    put(MediaStore.Downloads.MIME_TYPE, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        // Android 10+：指定保存到 Download 目录
                        put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
                        put(MediaStore.Downloads.IS_PENDING, 1) // 标记为“待处理”（防止文件损坏）
                    }
                }

                val resolver = contentResolver
                val wordUri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)

                wordUri?.let { uri ->
                    // 打开输出流，写入 Word 内容
                    resolver.openOutputStream(uri)?.use { outputStream ->
                        doc.write(outputStream)
                    }

                    // Android 10+：取消“待处理”标记，标记为正常文件
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        contentValues.clear()
                        contentValues.put(MediaStore.Downloads.IS_PENDING, 0)
                        resolver.update(uri, contentValues, null, null)
                    }

                    // 回到主线程，提示并打开 Word
                    withContext(Dispatchers.Main) {
                        Toast.makeText(this@WordActivity, "Word生成成功：$uri", Toast.LENGTH_LONG)
                            .show()
                        openWordFile(uri) // 传入 MediaStore 生成的 Uri
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
                // 异常时回到主线程提示
                withContext(Dispatchers.Main) {
                    Toast.makeText(this@WordActivity, "生成失败：${e.message}", Toast.LENGTH_LONG).show()
                }
            }
        }
    }

    /**
     * OCR识别（示例为“模拟文字”，实际需集成Tesseract等OCR库）
     */
    private fun recognizeTextWithTesseract(bitmap: Bitmap): String {
        // 【实际项目】需集成Tesseract：
        // 1. 初始化TessBaseAPI + 加载训练数据（如 chi_sim.traineddata）
        // 2. 调用 tessBaseAPI.setImage(bitmap) 和 tessBaseAPI.getUTF8Text() 获取真实识别结果
        // 此处为演示，返回模拟文字
        return "模拟OCR识别结果：这是图片中的文字内容...\n\n"
    }

    /**
     * 打开生成的Word文件（调用系统应用）
     */
    private fun openWordFile(wordUri: Uri) {
        val intent = Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(wordUri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予临时读权限（必须）
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 确保在新任务中启动
        }
        // 检查是否有应用能打开 Word
        if (intent.resolveActivity(packageManager) != null) {
            startActivity(intent)
        } else {
            Toast.makeText(this, "未找到可打开Word的应用（如WPS、Microsoft Word）", Toast.LENGTH_SHORT).show()
        }
    }

    companion object {
        private const val TAG = "WordActivity"
    }
}